home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 4 / The Arsenal Files 4 (Arsenal Computer).ISO / casm / au116-as.exe / VIEW.CPP < prev    next >
C/C++ Source or Header  |  1994-08-07  |  12KB  |  443 lines

  1. // VIEW.CPP                                  1          1    6666
  2. // Dave Harris                                11         11   6
  3. // Compiled using Borland C++ ver 3.1       1 1        1 1   6666
  4. // 03-03-94                                  1     ..   1   6   6
  5. //                                           11111 .. 11111  666
  6. ////////////////////////////////////////////////////////////////////////
  7.  
  8. #include "au.hpp"
  9. #include <time.h>
  10.  
  11. #define PROGRAM "VIEW"  // Name of module
  12.  
  13. /*********************************************************************/
  14.  
  15. typedef struct
  16. {
  17.     int  disp_dirs;
  18.     char list_order[50];
  19.     char file_length;
  20. } VIEW_INFO;
  21.  
  22. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  23. static void print_method(AU *au, int method)
  24. {
  25.     BYTE color;
  26.  
  27.     if (file_is_not_optimal(method))
  28.         color = 11;         /* Unoptimal versions in cyan */
  29.     else if (file_is_stored(method))
  30.         color = 15;         /* Stored in white */
  31.     else
  32.     {
  33.         switch (method)
  34.         {
  35.             case 0:
  36.                 color = 14; break;      /* Unknown in yellow */
  37.             default:
  38.                 color = 10; break;      /* Optimal in green */
  39.         }
  40.     }
  41.     au_printf_c(au, color, "%-8s ",methods[method]);
  42. }
  43. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  44. static void print_attribute(AU *au, long attrib)
  45. {
  46.     if (attrib & 0x20)
  47.         au_printf(au, "a");
  48.     else
  49.         au_printf(au, "-");
  50.  
  51.     if (attrib & 0x04)
  52.         au_printf(au, "s");
  53.     else
  54.         au_printf(au, "-");
  55.  
  56.     if (attrib & 0x02)
  57.         au_printf(au, "h");
  58.     else
  59.         au_printf(au, "-");
  60.  
  61.     if (attrib & 0x01)
  62.         au_printf(au, "r");
  63.     else
  64.         au_printf(au, "w");
  65.  
  66.     if (attrib & 0x10)
  67.         au_printf(au, "D");
  68.     else
  69.         au_printf(au, "-");
  70.  
  71.     au_printf(au, " ");
  72.     return;
  73. }
  74. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  75. static void print_name(AU *au, VIEW_INFO *in, ARC_RECORD *record)
  76. {
  77.     int color;
  78.  
  79.     if (record->attrib & (0x02 | 0x04))
  80.         color = 12;    /* Red */
  81.     else if (record->attrib & 0x01)
  82.         color = 13;    /* Purple */
  83.     else if (record->attrib & 0x10)
  84.         color = 11;    /* Cyan */
  85.     else
  86.         color = 7;       /* Grey */
  87.  
  88.     if (in->disp_dirs == ON)
  89.     {
  90.         char temp[FLENGTH];
  91.         build_fname(temp, record->path, record->name);
  92.         au_printf_c(au, color, "%-*s", in->file_length+1, temp);
  93.         if (strlen(temp) >= in->file_length)
  94.             au_printf(au, "\n%*s", in->file_length+1, "");
  95.     }
  96.     else
  97.     {
  98.        au_printf_c(au, color, "%-*s", in->file_length+1, record->name);
  99.        if (strlen(record->name) >= in->file_length)
  100.             au_printf(au, "\n%*s", in->file_length+1, "");
  101.     }
  102.     return;
  103. }
  104. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  105. static void view_one(AU *au, char *file_name, ARC_HANDLE *arc_handle)
  106. {
  107.     ARC_RECORD record;
  108.     int ret_code;
  109.     long packed_sum = 0, unpacked_sum = 0, no_files = 0;
  110.     long actual_size;
  111.     int i, len;
  112.     BYTE crc;
  113.     VIEW_INFO *in = (VIEW_INFO *)au->info;
  114.  
  115.     crc = au->package[arc_handle->type].crc;
  116.  
  117.     au->number_processed++;
  118.  
  119.     len = strlen(in->list_order);
  120.     if (!au->no_extra)
  121.     {
  122.         au_printf(au, "@?6View@?H of Archive: @?1%s@?H", file_name);
  123.         if (arc_handle->is_self)
  124.             au_printf(au, " (Self Extracting %s)", au->package[arc_handle->type].extension);
  125.         au_printf(au, "\n\n");
  126.         for (i=0; i < len; i++)
  127.         {
  128.             switch (in->list_order[i])
  129.             {
  130.             case 'N':
  131.                 au_printf(au, "%-*s", in->file_length+1, "Name");   break;
  132.             case 'O':
  133.                 au_printf(au, "Original "); break;
  134.             case 'P':
  135.                 au_printf(au, "  Packed "); break;
  136.             case 'S':
  137.                 au_printf(au, "Sp "); break;
  138.             case '%':
  139.                 au_printf(au, "% Save  "); break;
  140.             case 'D':
  141.                 au_printf(au, "Date     "); break;
  142.             case 'T':
  143.                 au_printf(au, "Time     "); break;
  144.             case 'A':
  145.                 au_printf(au, "Attr. "); break;
  146.             case 'C':
  147.                 if (crc != 0)
  148.                     au_printf(au, "CRC");
  149.                 if (crc == 32)
  150.                     au_printf(au, "%*c", 6, ' ');
  151.                 else if (crc == 16)
  152.                     au_printf(au, "%*c", 2, ' ');
  153.                 break;
  154.             case 'M':
  155.                 au_printf(au, "Method   ");  break;
  156.             case '_':
  157.                 au_printf(au, " "); break;
  158.             }
  159.         }
  160.         au_printf(au, "\n");
  161.         au_printf(au, "-------------------------------------------------------------------------------\n");
  162.     }
  163.  
  164.     for (;;)
  165.     {
  166.         ret_code = arc_handle->get_record(au, &record);
  167.         if (ret_code == EOF)
  168.             break;
  169.         else if (ret_code == -2)
  170.         {
  171.             add_to_bad_list(au, au->source_directory, file_name);
  172.             return;
  173.         }
  174.         else if (ret_code == -3)
  175.         {
  176.             au_printf(au, "Internal format unknown\n");
  177.             return;
  178.         }
  179.         else if (in->disp_dirs != ON && record.attrib & 0x10)
  180.             continue;
  181.  
  182.         for (i=0; i < len; i++)
  183.         {
  184.             switch (in->list_order[i])
  185.             {
  186.             case 'N':
  187.                 print_name(au, in, &record);
  188.                 break;
  189.             case 'O':
  190.                 au_printf(au, "%8ld ", record.unpacked_size); break;
  191.             case 'P':
  192.                 au_printf(au, "%8ld ", record.packed_size); break;
  193.             case 'S':
  194.                 if (record.encrypted)
  195.                     au_printf(au, "@?5P@?H  ");
  196.                 else
  197.                     au_printf(au, "   ");
  198.                 break;
  199.             case '%':
  200.                 au_printf(au, "%s  ",percent_string(record.unpacked_size, record.packed_size));
  201.                 break;
  202.             case 'D':
  203.                 au_printf(au, "%s ",date_to_string(&record.date));
  204.                 break;
  205.             case 'T':
  206.                 au_printf(au, "%s ", hms_to_string(record.hour, record.min, record.sec));
  207.                 break;
  208.             case 'C':
  209.                 if (crc == 32)
  210.                     au_printf(au, "%8lx ",record.crc);
  211.                 else if (crc == 16)
  212.                     au_printf(au, "%4lx ",record.crc);
  213.                 break;
  214.             case 'A':
  215.                 print_attribute(au, record.attrib);
  216.                 break;
  217.             case 'M':
  218.                 print_method(au, record.method);
  219.                 break;
  220.             case '_':
  221.                 au_printf(au, " ");
  222.                 break;
  223.             }
  224.         }
  225.         au_printf(au, "\n");
  226.  
  227.         no_files++;
  228.         packed_sum += record.packed_size;
  229.         unpacked_sum += record.unpacked_size;
  230.     }
  231.     if (!au->no_extra)
  232.     {
  233.         struct ftime ftime;
  234.         arc_handle->get_time(&ftime);
  235.         au_printf(au, "-------------------------------------------------------------------------------\n");
  236.         for (i=0; i < len; i++)
  237.         {
  238.             switch (in->list_order[i])
  239.             {
  240.             case 'N':
  241.                 au_printf(au, "%4d ", no_files);
  242.                 au_printf(au, "%s%*s", no_files == 1 ? "File " : "Files", in->file_length-9, "");
  243.                 break;
  244.             case 'O':
  245.                 au_printf(au, "%8ld ", unpacked_sum);
  246.                 break;
  247.             case 'P':
  248.                 au_printf(au, "%8ld ", packed_sum);
  249.                 break;
  250.             case '%':
  251.                 au_printf(au, "%s  ", percent_string(unpacked_sum, packed_sum));
  252.                 break;
  253.             case 'D':
  254.             {
  255.                 DATE date;
  256.                 date.year  = ftime.ft_year+80;
  257.                 date.month = ftime.ft_month;
  258.                 date.day   = ftime.ft_day;
  259.                 printf("%s ", date_to_string(&date));
  260.                 break;
  261.             }
  262.             case 'S':
  263.                 if (in->list_order[i+1] != '\0')
  264.                     au_printf(au, "   "); break;
  265.             case 'T':
  266.                 au_printf(au, "%s ", hms_to_string(ftime.ft_hour, ftime.ft_min, ftime.ft_tsec*2));
  267.                 break;
  268.             case 'M':
  269.                 if (i > 0 && in->list_order[i-1] == 'C' || in->list_order[i+1] == '\0')
  270.                     version_print(au, arc_handle->version, 19,
  271.                                   (BOOLEAN)(crc == 0));
  272.                 else
  273.                     version_print(au, arc_handle->version, 9, TRUE);
  274.                 break;
  275.             case 'A':
  276.             {
  277.                 struct ffblk ffblk;
  278.                 findfirst(file_name, &ffblk, 0);
  279.                 print_attribute(au, ffblk.ff_attrib);
  280.                 break;
  281.             }
  282.             case '_':
  283.                 au_printf(au, " "); break;
  284.             }
  285.         }
  286.         au_printf(au, "\n");
  287.         /* Not sure what else to do at this point */
  288.         if (strncmp(in->list_order, "NOP%", 4) == 0 && in->file_length == FILE_SIZE)
  289.         {
  290.             actual_size = arc_handle->file_length();
  291.             au_printf(au, "%22s %8ld ", "Overhead +", actual_size - packed_sum);
  292.             au_printf(au, "%s%% Overhead",percent_string(actual_size, packed_sum));
  293.             au_printf(au, "\n");
  294.             au_printf(au, "%22s %8ld ", "File Size =", actual_size);
  295.             au_printf(au, "%s%% True Savings", percent_string(unpacked_sum, actual_size));
  296.             au_printf(au, "\n\n");
  297.         }
  298.     }
  299.     return;
  300. }
  301. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  302. static int view(AU *au, char *file_name)
  303. {
  304.     ARC_HANDLE arc_handle;
  305.  
  306.     check_for_key();
  307.  
  308.     arc_handle.init(au, file_name);
  309.  
  310.     if (arc_handle.type > 0)
  311.         view_one(au, file_name, &arc_handle);
  312.     arc_handle.deinit(au);
  313.  
  314.     return 0;
  315. }
  316. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  317. static void ReadCFGInfo(AU *au, CFG_HANDLE *cfg_handle)
  318. {
  319.     char string[200],
  320.          string2[200],
  321.          string3[200];
  322.     VIEW_INFO *in = (VIEW_INFO *)au->info;
  323.  
  324.     for(EVER)
  325.     {
  326.         if (cfg_handle->read_line(au, string) == EOF)
  327.             break;
  328.  
  329.         split_string(string, string2);
  330.         split_string(string, string3);
  331.  
  332.         if (string2[0] == '\0')
  333.             continue;
  334.  
  335.         strcpy(au->curOpt,string2);
  336.         au->curVal = string3;
  337.         switch (toupper(string2[1]) << 8 | toupper(string2[0]))
  338.         {
  339.             case 'BE':                                          // Begin
  340.                 return;
  341.             case 'SE':                                          // Self_Extracts
  342.                 au->self_extracts = get_value(au, OFF | ON);
  343.                 break;
  344.             case 'PA':                                          // Paths
  345.                 au->unarc_paths = get_value(au, OFF | ON);
  346.                 break;
  347.             case 'NA':                                          // Name_Length
  348.                 in->file_length = atoi(string3);
  349.                 if (in->file_length < FILE_SIZE)
  350.                     in->file_length = FILE_SIZE;
  351.                 break;
  352.             case 'LI':                                          // List_Order
  353.                 strcpy(in->list_order, string3);
  354.                 break;
  355.             default:
  356.                 cfg_handle->invalid_option(au, string2);
  357.         }
  358.     }
  359. }
  360. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  361. static BYTE parse_comm_line(AU *au, char option, char *cur_argv,
  362.                             PARSE_TYPE type)
  363. {
  364.     VIEW_INFO *in = (VIEW_INFO *)au->info;
  365.  
  366.     switch (type)
  367.     {
  368.     case PARSE_PARAM_OPTION:
  369.         switch (option)
  370.         {
  371.         case 'X':
  372.             au->self_extracts = get_value(au, OFF | ON);
  373.             break;
  374.         case 'P':
  375.             if (toupper(*cur_argv) == 'A')
  376.             {
  377.                 strcpy(au->curOpt, "-PA");
  378.                 au->curVal = cur_argv+1;
  379.                 in->disp_dirs = get_value(au, OFF | ON);
  380.             }
  381.             break;
  382.         case 'N':
  383.             in->file_length = atoi(cur_argv);
  384.             if (in->file_length < FILE_SIZE)
  385.                 in->file_length = FILE_SIZE;
  386.             break;
  387.         case 'L':
  388.             strcpy(in->list_order, cur_argv);
  389.             strupr(in->list_order);
  390.             break;
  391.         case '?':
  392.             au_standard_opt_header(au, "View",
  393.                "@?3-X@?Hon|off         self e@?3X@?Htracts\n"
  394.                "@?3-PA@?Hon|off        display archived file @?3PA@?Hths\n"
  395.                "@?3-N@?Hn              file@?3N@?Hame length (default and minimum 13)\n"
  396.                "@?3-L@?Dx@?H              @?3L@?Hist order, where @?Dx@?H = string of:\n"
  397.                "  @?DA@?H - @?DA@?Httributes\n"
  398.                "  @?DC@?H - @?DC@?HRC\n"
  399.                "  @?DD@?H - @?DD@?Hate\n"
  400.                "  @?DM@?H - @?DM@?Hethod\n"
  401.                "  @?DN@?H - file @?DN@?Hame\n"
  402.                "  @?DO@?H - @?DO@?Hriginal size\n"
  403.                "  @?DP@?H - @?DP@?Hacked size\n"
  404.                "  @?DS@?H - @?DS@?Hpecial attributes\n"
  405.                "  @?DT@?H - @?DT@?Hime\n"
  406.                "  @?D%@?H - @?DP@?Hercent savings\n"
  407.                "  @?D_@?H - Extra space\n");
  408.             exit (0);
  409.         default:
  410.             au_invalid_option(au, PROGRAM, option);
  411.         }
  412.         return TRUE;
  413.     }
  414.     return FALSE;
  415. }
  416. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  417. int main_view(AU *au, int argc, char *argv[])
  418. {
  419.     char string[120];
  420.     HANDLE file;
  421.     int i;
  422.     VIEW_INFO *in;
  423.  
  424.     in = new VIEW_INFO;
  425.     memset(in, '\0', sizeof(VIEW_INFO));
  426.     au->info = in;
  427.     in->disp_dirs = ON;
  428.     in->file_length = FILE_SIZE;
  429.     strcpy(in->list_order, "NOP%DTCMS");
  430.  
  431.     au->allow_rename = FALSE;      // no sense since unarcers not called
  432.  
  433.     ReadGlobalCFGInfo(au, au->cfg_file, PROGRAM, ReadCFGInfo);
  434.     generic_parse_comm_line(au, argc, argv, parse_comm_line);
  435.     process_files(au, view);
  436.  
  437.     if (!au->no_extra)
  438.         au_printf_c(au, 15, "\nFiles Processed = %d", au->number_processed);
  439.  
  440.     return 0;
  441. }
  442.  
  443.